package com.fiveGroup.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;

/**
 * ClassName: OSSUtils
 * Package:
 * Description
 * <p>
 * <p>
 * * 阿里云OSS工具类
 * 分支测试
 *
 * @Author wen
 * @Create 2025/9/25 23:28
 * @Version 1.0
 */
@Component
public class OSSUtils {

    @Value("${oss.accessKeyId}")
    private String accessKeyId;

    @Value("${oss.accessKeySecret}")
    private String accessKeySecret;

    @Value("${oss.endpoint}")
    private String endpoint;

    @Value("${oss.bucketName}")
    private String bucketName;

    @Value("${oss.serverUrl}")
    private String serverUrl;

    // 初始化OSS客户端
    public OSS initOss() {
        return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }

    /***
     *
     * 上传文件到OSS
     * @param fileName 文件名
     * @param data 文件字节数组
     * @return 文件的完整路径
     * @throws FileNotFoundException
     */

    public String upload(String fileName, byte[] data) throws FileNotFoundException {

        OSS oss = initOss();
        try {
            //获取文件名后缀
            String extName = FileNameUtil.extName(fileName);

            // 将字节数组转换为输入流
            InputStream inputStream = new ByteArrayInputStream(data);

            //生成新的随机名称
            String randomFileName = RandomUtil.randomString(20) + StrUtil.DOT + extName;

            // 上传oss文件
            //桶，对象名，输入流
            oss.putObject(bucketName, randomFileName, inputStream);

            //返回文件的完整路径
            return serverUrl + StrUtil.SLASH + randomFileName;

        } finally {
            // 关闭OSS客户端
            oss.shutdown();
        }
    }


    /***
     *
     * 删除OSS文件
     * @param url 文件的完整路径
     * @return 删除结果
     */

    public String delete(String url) {
        OSS oss = initOss();
        try {
            // 解析URL获取对象名
            List<String> list = StrUtil.split(url, "/");
            //获取文件名
            String fileName = CollUtil.getLast(list);
            //判断是否有文件名
            if (StrUtil.isBlank(fileName)) {
                return "文件名称为空";
            }
            //删除只能根据文件名称删除
            // 删除OSS文件
            oss.deleteObject(bucketName, fileName);

            return "删除成功";
        } finally {
            // 关闭OSS客户端
            oss.shutdown();
        }
    }
}
